package org.com.system.util.model;

import java.util.List;

/**
 * 所有Dao的接口
 * @author Gandilong
 */
public interface Dao<T> {
	
	/**
	 * 根据参数保存得一条记录数据
	 * @param values 请求参数(Type:Map)
	 * @param entityClass 实体类(Type:<T>)
	 */
	public void save(T entity);
	
	/**
	 * 根据参数保存多条记录数据
	 * @param values 请求参数(Type:Map)
	 * @param entityClass 实体类(Type:<T>)
	 */
	public void save(List<T> entitys);
	
	/**
	 * 根据参数保存得一条记录数据
	 * @param values 请求参数(Type:Map)
	 * @param entityClass 实体类(Type:<T>)
	 */
	public void save(ActionValues<String,Object> values,Class<T> entityClass);
	
	/**
	 * 根据参数保存多条记录数据
	 * @param values 请求参数(Type:Map)
	 * @param entityClass 实体类(Type:<T>)
	 */
	public void save(List<ActionValues<String,Object>> values,Class<T> entityClass);
	
	/**
	 * 根据参数删除一条记录数据,实体中ID字段值必须在数据库中存在
	 * @param values 请求参数(Type:Map)
	 * @param entityClass 实体类(Type:<T>)
	 */
	public void delete(T entity);
	
	/**
	 * 根据参数ID删除一条记录数据,实体中ID字段值必须在数据库中存在
	 * @param id 请求参数(Type:String)
	 * @param entityClass 实体类(Type:<T>)
	 */
	public void delete(String id,Class<T> entityClass);
	
	/**
	 * 根据条件参数删除一条或多条符合条件的记录数据。
	 * （如果是用HibernateDao实现的Dao，则必须有ID字段值，也就只能删除一条数据，如果是JdbcDao或springDao则可以不要ID字段，可以根据条件删除一批数据）
	 * @param values 请求参数(Type:Map)
	 * @param entityClass 实体类(Type:<T>)
	 */
	public void delete(ActionValues<String,Object> values,Class<T> entityClass);
	
	/**
	 * 根据参数批量删除记录数据,实体中ID字段值必须在数据库中存在
	 * @param values 请求参数(Type:Map)
	 * @param entityClass 实体类(Type:<T>)
	 */
	public void delete(List<T> entity);
	
	/**
	 * 根据参数ID批量删除记录数据,实体中ID字段值必须在数据库中存在
	 * @param id 请求参数(Type:String)
	 * @param entityClass 实体类(Type:<T>)
	 */
	public void delete(List<String> ids,Class<T> entityClass);
	
	/**
	 * 根据ID取得一条记录数据,实体中ID字段值必须在数据库中存在
	 * @param id 请求参数(Type:String)
	 * @param entityClass 实体类(Type:<T>)
	 * @return T 实体对象
	 */
	public T get(String id,Class<T> entityClass);
	
	/**
	 * 根据条件取得一条记录数据
	 * @param values 请求参数(Type:Map)里面封装的数据做为条件查询
	 * @param entityClass 实体类(Type:<T>)
	 * @return T 实体对象
	 */
	public T get(ActionValues<String,Object> values,Class<T> entityClass);

	/**
	 * 查出对应表中所有记录
	 * @param values 请求参数(Type:Map)
	 * @param entityClass 实体类(Type:<T>)
	 * @return List<T>
	 */
	public List<T> list(Class<T> entityClass);
	
	/**
	 * 以分页形式查出对应表中所有记录
	 * @param values 请求参数(Type:Map)
	 * @param entityClass 实体类(Type:<T>)
	 * @return List<T>
	 */
	public List<T> list(Class<T> entityClass,Page page);
	
	/**
	 * 查出所有匹配的<T>记录
	 * @param values 请求参数(Type:Map)
	 * @param entityClass 实体类(Type:<T>)
	 * @return List<T>
	 */
	public List<T> list(ActionValues<String,Object> values,Class<T> entityClass);
	
	/**
     * 以分页形式查出匹配的<T>记录
	 * @param values 请求参数(Type:Map)
	 * @param entityClass 实体类(Type:<T>)
	 * @return List<T>
     * @author Gandilong at 2012-9-10上午10:29:35
     */
	public List<T> list(ActionValues<String,Object> values,Class<T> entityClass,Page page);
	
	/**
	 * 根据参数更新一条记录数据,实体中ID字段值必须在数据库中存在
	 * @param values 请求参数(Type:Map)
	 * @param entityClass 实体类(Type:<T>)
	 * 注意，该操作会更新实体中的所有字段的值到数据库中，包括空值
	 */
	public void update(T entity);
	
	/**
	 * 根据参数更新一批记录数据,实体中ID字段值必须在数据库中存在
	 * @param values 请求参数(Type:Map)
	 * @param entityClass 实体类(Type:<T>)
	 *注意，该操作会更新实体中的所有字段的值到数据库中，包括空值
	 */
	public void update(List<T> entitys);
	
	/**
	 * 根据参数更新一条记录数据
	 * @param values 请求参数(Type:Map)
	 * @param entityClass 实体类(Type:<T>
	 * 注意，该操作只会更新那些非空的字段值到数据库中,即：null值不更新,""更新
	 */
	public void update(ActionValues<String,Object> values,Class<T> entityClass);
	
	/**
	 * 根据参数更新多条记录数据
	 * @param values 请求参数(Type:Map)
	 * @param entityClass 实体类(Type:<T>)
	 * 注意，该操作只会更新那些非空的字段值到数据库中,即：null值不更新,""更新
	 */
	public void update(List<ActionValues<String,Object>> values,Class<T> entityClass);
	
}
